home *** CD-ROM | disk | FTP | other *** search
- /******************************************************************************
- *
- * NSSDC/CDF CDF 'select' operations.
- *
- * Version 1.0, 14-Feb-92, ST Systems (STX)
- *
- * Modification history:
- *
- * V1.0 14-Feb-92, J Love Original version (was part of `cdflib.c').
- *
- ******************************************************************************/
-
- #include "cdflib.h"
-
- /******************************************************************************
- * CDFsel.
- ******************************************************************************/
-
- CDFstatus CDFsel (ap, item, fnc)
- va_list *ap;
- long item;
- long *fnc;
- {
- CDFstatus Pstatus = CDF_OK;
-
- switch (item) {
- case CDF_: {
- CDFid id;
- id = va_arg (*ap, CDFid);
- if (id < 0 || id > CDF_MAX_CDFS-1) return BAD_CDF_ID;
- if (_CDFs[id] == NULL) return BAD_CDF_ID;
- _CURcdf = _CDFs[id];
- break;
- }
- case CDF_STATUS_: {
- _CURstatus = va_arg (*ap, CDFstatus);
- break;
- }
- case VAR_: {
- long var_num;
- var_num = va_arg (*ap, long);
- if (_CURcdf == NULL) return NO_CDF_SELECTED;
- if (var_num < 0 || var_num > CDF_MAX_VARS-1) return BAD_VAR_NUM;
- if (_CURcdf->var[var_num] == NULL) return NO_SUCH_VAR;
- _CURcdf->CURvar = _CURcdf->var[var_num];
- break;
- }
- case VAR_NAME_: {
- char *name;
- struct varSTRUCT *Var;
- name = va_arg (*ap, char *); /* no truncation of name
- if too long */
- if (_CURcdf == NULL) return NO_CDF_SELECTED;
- Var = _CURcdf->varHead;
- while (Var != NULL) {
- if (strcmpITB(Var->VDR.Name,name) == 0) break;
- Var = Var->varNext;
- }
- if (Var == NULL)
- return NO_SUCH_VAR;
- else
- _CURcdf->CURvar = Var;
- break;
- }
- case CDF_RECNUMBER_: {
- long recNum = va_arg (*ap, long);
- if (_CURcdf == NULL) return NO_CDF_SELECTED;
- if (recNum < 0) return BAD_REC_NUM;
- if (_CURcdf->GDR.NumVar == 0) STATUSdisp (NO_VARS_IN_CDF, Pstatus);
- _CURcdf->recnum = recNum;
- break;
- }
- case CDF_RECCOUNT_: {
- long recCount = va_arg (*ap, long);
- if (_CURcdf == NULL) return NO_CDF_SELECTED;
- if (recCount < 1) return BAD_REC_COUNT;
- if (_CURcdf->GDR.NumVar == 0) STATUSdisp (NO_VARS_IN_CDF, Pstatus);
- _CURcdf->reccount = recCount;
- break;
- }
- case CDF_RECINTERVAL_: {
- long recInterval = va_arg (*ap, long);
- if (_CURcdf == NULL) return NO_CDF_SELECTED;
- if (recInterval < 1) return BAD_REC_INTERVAL;
- if (_CURcdf->GDR.NumVar == 0) STATUSdisp (NO_VARS_IN_CDF, Pstatus);
- _CURcdf->recinterval = recInterval;
- break;
- }
- case CDF_DIMINDICES_: {
- long *indices = va_arg (*ap, long *);
- long dimN;
- if (_CURcdf == NULL) return NO_CDF_SELECTED;
- for (dimN = 0; dimN < _CURcdf->GDR.NumDims; dimN++)
- if (indices[dimN] < 0 ||
- indices[dimN] >= _CURcdf->GDR.DimSizes[dimN])
- return BAD_DIM_INDEX;
- if (_CURcdf->GDR.NumVar == 0) STATUSdisp (NO_VARS_IN_CDF, Pstatus);
- for (dimN = 0; dimN < _CURcdf->GDR.NumDims; dimN++)
- _CURcdf->indices[dimN] = indices[dimN];
- break;
- }
- case CDF_DIMCOUNTS_: {
- long *counts = va_arg (*ap, long *);
- long dimN;
- if (_CURcdf == NULL) return NO_CDF_SELECTED;
- for (dimN = 0; dimN < _CURcdf->GDR.NumDims; dimN++)
- if (counts[dimN] < 1) return BAD_DIM_COUNT;
- if (_CURcdf->GDR.NumVar == 0) STATUSdisp (NO_VARS_IN_CDF, Pstatus);
- for (dimN = 0; dimN < _CURcdf->GDR.NumDims; dimN++)
- _CURcdf->counts[dimN] = counts[dimN];
- break;
- }
- case CDF_DIMINTERVALS_: {
- long *intervals = va_arg (*ap, long *);
- long dimN;
- if (_CURcdf == NULL) return NO_CDF_SELECTED;
- for (dimN = 0; dimN < _CURcdf->GDR.NumDims; dimN++)
- if (intervals[dimN] < 1) return BAD_DIM_INTERVAL;
- if (_CURcdf->GDR.NumVar == 0) STATUSdisp (NO_VARS_IN_CDF, Pstatus);
- for (dimN = 0; dimN < _CURcdf->GDR.NumDims; dimN++)
- _CURcdf->intervals[dimN] = intervals[dimN];
- break;
- }
- case VAR_SEQPOS_: {
- long recNum;
- long *indices;
- long Voffset; /* value offset within record */
- long dimN;
-
- recNum = va_arg (*ap, long);
- indices = va_arg (*ap, long *);
-
- if (_CURcdf == NULL) return NO_CDF_SELECTED;
- if (_CURcdf->CURvar == NULL) return NO_VAR_SELECTED;
- if (recNum < 0) return BAD_REC_NUM;
- for (dimN = 0; dimN < _CURcdf->GDR.NumDims; dimN++) {
- if (indices[dimN] < 0 || indices[dimN] >= _CURcdf->GDR.DimSizes[dimN])
- return BAD_DIM_INDEX;
- }
-
- INDICESoffsetV (_CURcdf->GDR.NumDims, _CURcdf->CURvar, indices, Voffset);
- _CURcdf->CURvar->seqValueOffset = recNum *
- _CURcdf->CURvar->NphyRecValues + Voffset;
-
- break;
- }
- case ATTR_: {
- long attrnum;
- struct attrSTRUCT *Attr;
- struct entrySTRUCT *Entry;
-
- attrnum = va_arg (*ap, long );
-
- if (_CURcdf == NULL) return NO_CDF_SELECTED;
- if (attrnum < 0) return BAD_ATTR_NUM;
-
- Attr = _CURcdf->attrHead;
- while (Attr != NULL) {
- if (attrnum == Attr->ADR.Num) break;
- Attr = Attr->attrNext;
- }
-
- if (Attr != NULL) {
- _CURcdf->CURattr = Attr;
- if (_CURcdf->CURentryNum != RESERVED_ENTRYNUM) {
- Entry = Attr->entryHead;
- while (Entry != NULL) {
- if (Entry->AEDR.Num == _CURcdf->CURentryNum) break;
- Entry = Entry->entryNext;
- }
- if (Entry != NULL)
- _CURcdf->CURentry = Entry;
- else
- _CURcdf->CURentry = NULL;
- }
- else
- _CURcdf->CURentry = NULL;
- }
- else
- return NO_SUCH_ATTR;
-
- break;
- }
- case ATTR_NAME_: {
- char *name;
- struct attrSTRUCT *Attr;
- struct entrySTRUCT *Entry;
-
- name = va_arg (*ap, char *); /* no truncation of name if too long */
-
- if (_CURcdf == NULL) return NO_CDF_SELECTED;
-
- Attr = _CURcdf->attrHead;
- while (Attr != NULL) {
- if (strcmpITB(name,Attr->ADR.Name) == 0) break;
- Attr = Attr->attrNext;
- }
-
- if (Attr != NULL) {
- _CURcdf->CURattr = Attr;
- if (_CURcdf->CURentryNum != RESERVED_ENTRYNUM) {
- Entry = Attr->entryHead;
- while (Entry != NULL) {
- if (Entry->AEDR.Num == _CURcdf->CURentryNum) break;
- Entry = Entry->entryNext;
- }
- if (Entry != NULL)
- _CURcdf->CURentry = Entry;
- else
- _CURcdf->CURentry = NULL;
- }
- else
- _CURcdf->CURentry = NULL;
- }
- else
- return NO_SUCH_ATTR;
- break;
- }
- case ENTRY_: {
- long entryNum;
- struct entrySTRUCT *Entry;
-
- entryNum = va_arg (*ap, long );
-
- if (_CURcdf == NULL) return NO_CDF_SELECTED;
- if (entryNum < 0) return BAD_ENTRY_NUM;
-
- _CURcdf->CURentryNum = entryNum;
-
- if (_CURcdf->CURattr != NULL) {
- Entry = _CURcdf->CURattr->entryHead;
- while (Entry != NULL) {
- if (Entry->AEDR.Num == entryNum) break;
- Entry = Entry->entryNext;
- }
- if (Entry != NULL)
- _CURcdf->CURentry = Entry;
- else
- _CURcdf->CURentry = NULL;
- }
- else
- _CURcdf->CURentry = NULL;
-
- break;
- }
- default: {
- *fnc = item;
- break;
- }
- }
- return Pstatus;
- }
-